#ifndef CICORE_VECTOR3D_H
#define CICORE_VECTOR3D_H

#include <cmath>

namespace CICore {
    class Vector3D {        

    public:        
        Vector3D (const float x=0, const float y=0, const float z=0);        //Constructor
        virtual ~Vector3D ();                                                //Destructor

        float x, y, z;      //Vector3D's direction                    

        //Utility Methods
        float SquaredLength() const;     //Method called to compute the squared vector length
        float Length() const;            //Method called to compute the vector length
        void Normalize();                //Method called to normalize the vector
    };    
    
    //Basic vector's unary operations
    Vector3D& operator ++ (Vector3D& v, int);                //Postfix increment
    Vector3D& operator ++ (Vector3D& v);                     //Prefix increment

    Vector3D& operator -- (Vector3D& v, int);                //Postfix decrement
    Vector3D& operator -- (Vector3D& v);                     //Prefix increment

    //Basic vector's binary operations
    Vector3D operator + (const Vector3D& a, const Vector3D& b);        //Sum between two vectors
    Vector3D& operator += (Vector3D& a, const Vector3D& b);            //Assignment by addition between two vectors

    Vector3D operator - (const Vector3D& a, const Vector3D& b);        //Difference between two vectors
    Vector3D& operator -= (Vector3D& a, const Vector3D& b);            //Assignment by substraction between two vectors
    
    Vector3D operator * (const Vector3D& a, const Vector3D& b);        //Product between two vectors
    Vector3D& operator *= (Vector3D& a, const Vector3D& b);            //Assignment by multiplication between two vectors
    
    Vector3D operator / (const Vector3D& a, const Vector3D& b);        //Quotient between two vectors
    Vector3D& operator /= (Vector3D& a, const Vector3D& b);            //Assignment by division between two vectors

    Vector3D operator + (const Vector3D& a, const float b);        //Sum between a vector and a float value
    Vector3D& operator += (Vector3D& a, const float b);            //Assignment by addition between a vector and a float value

    Vector3D operator - (const Vector3D& a, const float b);        //Difference between a vector and a float value
    Vector3D& operator -= (Vector3D& a, const float b);            //Assignment by substraction between a vector and a float value
    
    Vector3D operator * (const Vector3D& a, const float b);        //Product between a vector and a float value
    Vector3D& operator *= (Vector3D& a, const float b);            //Assignment by multiplication between a vector and a float value
    
    Vector3D operator / (const Vector3D& a, const float b);        //Quotient between a vector and a float value
    Vector3D& operator /= (Vector3D& a, const float b);            //Assignment by division between a vector and a float value


}
#endif /* CICORE_VECTOR3D_H */
